package org.example.product;

import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import org.example.tool.MixAiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 流式产品服务
 * 结合 @AiService 的功能和流式响应效果
 */
@Service
public class StreamingProductService {
    
    @Autowired
    private MixAiService mixAiService;
    
    /**
     * 流式聊天方法
     * 使用 @AiService 获取完整响应，然后应用流式效果
     * 这样既保持了聊天记忆、工具调用等功能，又实现了流式响应效果
     * 
     * @param memoryId 会话记忆ID - 保持 @AiService 的聊天记忆功能
     * @param message 用户消息
     * @param handler 流式响应处理器
     */
    public void chatStream(String memoryId, String message, StreamingChatResponseHandler handler) {
        try {
            // 使用 @AiService 获取完整响应，保持所有功能：
            // - 聊天记忆管理 (chatMemoryProvider)
            // - 工具调用 (tools)
            // - 系统消息处理
            String fullResponse = mixAiService.chatShop(memoryId, message);
            
            // 模拟流式响应，按字符分割（真正的打字机效果）
            for (char c : fullResponse.toCharArray()) {
                handler.onPartialResponse(String.valueOf(c));
                
                // 模拟网络延迟 - 调整延迟时间
                Thread.sleep(100);  // 增加延迟，让打字机效果更明显
            }
            
            handler.onCompleteResponse(null);
            
        } catch (Exception e) {
            handler.onError(e);
        }
    }
    
    /**
     * 按词分割的流式聊天方法
     * 使用 @AiService 获取完整响应，然后按词分割应用流式效果
     * 
     * @param memoryId 会话记忆ID
     * @param message 用户消息
     * @param handler 流式响应处理器
     */
    public void chatStreamByWords(String memoryId, String message, StreamingChatResponseHandler handler) {
        try {
            String fullResponse = mixAiService.chatShop(memoryId, message);
            
            // 按词分割
            String[] words = fullResponse.split(" ");
            for (int i = 0; i < words.length; i++) {
                String word = words[i];
                if (i < words.length - 1) {
                    word += " ";
                }
                handler.onPartialResponse(word);
                
                // 模拟网络延迟
                Thread.sleep(200);
            }
            
            handler.onCompleteResponse(null);
            
        } catch (Exception e) {
            handler.onError(e);
        }
    }
    
    /**
     * 真正的打字机效果流式聊天方法
     * 使用 @AiService 获取完整响应，然后实现真正的打字机效果
     * 
     * @param memoryId 会话记忆ID
     * @param message 用户消息
     * @param delayMs 每个字符的延迟时间（毫秒）
     */
    public void chatStreamWithTypewriter(String memoryId, String message, long delayMs) {
        try {
            String fullResponse = mixAiService.chatShop(memoryId, message);
            
            System.out.println("🎬 开始打字机效果演示...");
            
            // 真正的打字机效果：逐字符显示
            for (char c : fullResponse.toCharArray()) {
                System.out.print(c);
                System.out.flush();
                
                // 打字延迟
                Thread.sleep(delayMs);
            }
            
            System.out.println("\n\n🎯 打字机效果完成！");
            
        } catch (Exception e) {
            System.err.println("打字机效果发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 普通聊天方法（直接代理到 @AiService）
     * 
     * @param memoryId 会话记忆ID
     * @param message 用户消息
     * @return AI回复
     */
    public String chat(String memoryId, String message) {
        return mixAiService.chatShop(memoryId, message);
    }
}
